#include <Mkeyin2.h>

Mkeyin2<2> Mkey;

const uint8_t kId = 27;
const uint8_t kCmdId = 0x88;
//========所有IO功能口定义===========
const int LMotor = 10; //左震动电机
const int RMotor = 6; //右震动电机
const int buzzer = 9; //蜂鸣器接口
const int SET = 4; //串口无线模块AT调试使能接口
const int OFF_POW = 23; //关机端口（默认必须低电平否则会自动关机）
const int Bat = A4; //电池电压读取
const int Lxvr = A2; //左摇杆上下
const int Lyvr = A3; //左摇杆左右
const int Rxvr = A0; //右摇杆上下
const int Ryvr = A1; //右摇杆上下
const int RULED = 17; //运行状态指示灯
//==============变量定义==================
long keyint = 0; //测试电压摇杆标记变量
byte setwi;//无线模块设置状态变量
float Var;//计算公式得到的数值存储变量
float voltage;//实际电压存储变量
byte Lset;  //左摇杆数据发送状态变量
byte Rset;  //左摇杆数据发送状态变量
int L1int = 0; //左摇杆上下数据存储变量
int L2int = 0; //左摇杆左右数据存储变量
int R1int = 0; //右摇杆上下数据存储变量
int R2int = 0; //右摇杆左右数据存储变量
boolean setWX = false; //false!true 切换串口转发功能标志，主要用于软件设置无线模块。
bool enFlag = false;

uint8_t cmd[8] = {0};

void resetCmd()
{
    cmd[0] = kCmdId;
    cmd[1] = 0;
    cmd[2] = 0;
    cmd[3] = 0;
    cmd[4] = 0;
    cmd[5] = 0;
    cmd[6] = 0;
    cmd[7] = kId;
}
void setup() {
  pinMode(OFF_POW, OUTPUT);//设定关机端口为输出
  digitalWrite(OFF_POW, LOW);//关机端口默认设置为关闭状态否则会自动关机
  Var = 1023.0 / (3.3 / (10.0 / (10.0 + 10.0))); //电池电压计算公式，并将计算好的数值送给变量
  pinMode(SET, OUTPUT);//设置为输出
  pinMode(RULED, OUTPUT);//设置为输出
  Serial1.begin(9600);//连接无线模块的串口1
  Serial.begin(9600);//默认虚拟串口
  Mkey.begin();//按键函数库初始化
  digitalWrite(SET, HIGH);//设置无线模块管脚关闭
  resetCmd();
}
void loop() {
  if (setWX == false) { //判断串口转发标志是否开启false代表没有开启
    if (Serial1.available()) {//判断无线模块是否接收到了数据
      if (Serial1.read() == 'A')//串口接收到了数据就调用蜂鸣器函数
        bibi();//蜂鸣器函数 哔哔响
    }
  }
  voltage = (float)analogRead(Bat) / Var; //读取电压并除以计算公式所得到的数值，然后将得到的实际电压送给实际电压存储变量
  L1int = analogRead(Lxvr);//读取左摇杆上下数据
  //L2int = analogRead(Lyvr);//读取左摇杆左右数据
  //R1int = analogRead(Rxvr);//读取右摇杆上下数据
  R2int = analogRead(Ryvr);//读取右摇杆左右数据
  L1int = map(L1int, 0, 1023, 0, 255); //将左摇杆上下数据1023转换成255，并送给发送数据串里
  //L2int = map(L2int, 0, 1023, 0, 255); //将左摇杆左右数据1023转换成255，并送给发送数据串里
  //R1int = map(R1int, 0, 1023, 0, 255); //将右摇杆上下数据1023转换成255，并送给发送数据串里
  R2int = map(R2int, 0, 1023, 0, 255); //将右摇杆左右数据1023转换成255，并送给发送数据串里
  if(Mkey.released(4))
    enFlag = true;
  else if(Mkey.pressed(4))
    enFlag = false;
  if(enFlag) {
    cmd[1] |= 0x1;
    cmd[2] = L1int;
    cmd[3] = R2int;
    for(int i=0; i<8; ++i)
        Serial1.write(cmd[i]);
    delay(50);
    resetCmd();
  }
  if (Mkey.update()) {
    for (int i = 0; i < Mkey.getDataWidth(); i++);
    keyint = Mkey.getCurrent();
  }
  //======SELECT+START按键切换无线串口模块AT设置===============
  if (keyint == 16383) {
    setwi = !setwi; //设置标志位
    digitalWrite(RULED, setwi); //功能指示灯开启用于显示无线模块开始设置
    delay(600);//为了防止按键重复开启关闭设置端口必须延时
    if (setwi == 1) { //如果是组合键按下则启动设置无线模块参数
      digitalWrite(SET, LOW);//设置无线模块管脚开启
      setWX = true; //串口转发标志true代表开启串口转发为了软件设置串口
    }
    else {
      delay(600);//为了防止按键重复开启关闭设置端口必须延时
      digitalWrite(SET, HIGH);//关闭无线模块的设置管脚
      digitalWrite(RULED, LOW);//功能指示关闭无线模块设置结束
      setWX = false; //串口转发标志false代表关闭串口转发为了软件设置串口
    }
  }
  if (setWX == true) {
    if (Serial.available())
        Serial1.write(Serial.read());
    if (Serial1.available())
        Serial.write(Serial1.read());
  }
  if (voltage < 3.6)
    tone(buzzer, 1000);
  else if (voltage >= 3.65)
    noTone(buzzer);
}
void bibi() {
  tone(buzzer, 800); // 发送给蜂鸣器800Hz声音信号
  delay(300);//延时200ms
  tone(buzzer, 500); // 发送给蜂鸣器500Hz声音信号
  delay(300);
  tone(buzzer, 1000); // 发送给蜂鸣器1KHz声音信号
  delay(300);//延时200ms
  noTone(buzzer); //停止发送
}
